home *** CD-ROM | disk | FTP | other *** search
/ Animation How-To / Animation How-to CD.iso / PLY / CHAPTER2 / DICE / TUMBLE.BAS < prev   
BASIC Source File  |  1994-01-01  |  7KB  |  270 lines

  1. ' TUMBLE.BAS
  2.  
  3. DECLARE SUB rotate (x, y, z)
  4. COMMON SHARED rad, a, xrotate, yrotate, zrotate
  5.  
  6. TYPE Vector
  7.   x AS SINGLE
  8.   y AS SINGLE
  9.   z AS SINGLE
  10. END TYPE
  11.  
  12. DIM cube(8) AS Vector, c(8) AS Vector, last(8) AS Vector, hist(8)
  13. DIM f(8) AS Vector, fo(8) AS Vector, r(8) AS Vector, marker AS Vector
  14. ' set the screen up with pretty rainbow colors
  15.  
  16. SCREEN 12
  17. WINDOW (-4, -2.2)-(4, 3.8)
  18.  
  19. pi = 3.1415926535#
  20. rad = pi / 180
  21.  
  22. ' A static reference cube
  23.  
  24. FOR v = 1 TO 8
  25.     READ c(v).x, c(v).y, c(v).z
  26. NEXT v
  27.  
  28. DATA  1,  1,  1
  29. DATA  1,  1, -1
  30. DATA  1, -1,  1
  31. DATA  1, -1, -1
  32.  
  33. DATA -1,  1,  1
  34. DATA -1,  1, -1
  35. DATA -1, -1,  1
  36. DATA -1, -1, -1
  37.  
  38. OPEN "marker.inc" FOR OUTPUT AS #1
  39.  
  40. 'DO WHILE INKEY$ = ""
  41.  
  42. FOR a = -1 TO 1.5 STEP .1
  43.     LINE (-3.15, a)-(-2.48, a)
  44.     LINE (2.48, a)-(3.15, a)
  45. NEXT a
  46. LOCATE 26, 10: PRINT "Corner"
  47. LOCATE 27, 8: PRINT "Histogram"
  48. LOCATE 26, 67: PRINT "Face"
  49. LOCATE 27, 65: PRINT "Histogram"
  50.  
  51. FOR a = 1 TO 8
  52.     cube(a) = c(a)
  53. NEXT a
  54.  
  55. minang = 0
  56. mindiff = 20
  57.  
  58. FOR angle = 0 TO 360
  59.     an = (angle - 360) / 720
  60.  
  61.     FOR a = 1 TO 8
  62.         cube(a) = c(a)
  63.     NEXT a
  64.  
  65.     ang = angle * rad
  66.     factor = 90
  67.  
  68.     xrotate = factor * (2 * SIN(ang) + SIN(3 * ang) / 3)
  69.     yrotate = factor * (2 * COS(ang) - COS(3 * ang) / 3)
  70.     zrotate = factor * (COS(2 * ang))
  71.  
  72.     marker.x = 3
  73.     marker.y = 3
  74.     marker.z = 3
  75.  
  76.     CALL rotate(marker.x, marker.y, marker.z)
  77.  
  78.     FOR a = 1 TO 8
  79.  
  80.         ' semi - equal coverage tumbling
  81.  
  82.         xo = -1.3
  83.         yo = 2.5
  84.         PSET (4 * an + xo, xrotate / 360 + yo), 4
  85.         PSET (4 * an + xo, yrotate / 360 + yo), 2
  86.         PSET (4 * an + xo, zrotate / 360 + yo), 1
  87.  
  88. 'rotate
  89.  
  90.         CALL rotate(cube(a).x, cube(a).y, cube(a).z)
  91.  
  92.         IF (angle = 0) THEN
  93.           r(a).x = cube(a).x
  94.           r(a).y = cube(a).y
  95.           r(a).z = cube(a).z
  96.       END IF
  97.  
  98.      NEXT a
  99.  
  100. 'undraw the old ones
  101.     
  102.      FOR a = 1 TO 8
  103.          CIRCLE (last(a).x, last(a).y), (last(a).z + 5) / 15, 0
  104.      NEXT a
  105.  
  106.      FOR a = 1 TO 6
  107.          CIRCLE (fo(a).x, fo(a).y), .1, 0
  108.      NEXT a
  109.  
  110.  
  111.      LINE (last(1).x, last(1).y)-(last(2).x, last(2).y), 0
  112.      LINE (last(2).x, last(2).y)-(last(4).x, last(4).y), 0
  113.      LINE (last(3).x, last(3).y)-(last(1).x, last(1).y), 0
  114.      LINE (last(4).x, last(4).y)-(last(3).x, last(3).y), 0
  115.  
  116.      LINE (last(5).x, last(5).y)-(last(6).x, last(6).y), 0
  117.      LINE (last(6).x, last(6).y)-(last(8).x, last(8).y), 0
  118.      LINE (last(8).x, last(8).y)-(last(7).x, last(7).y), 0
  119.      LINE (last(7).x, last(7).y)-(last(5).x, last(5).y), 0
  120.                                                                      
  121.      LINE (last(1).x, last(1).y)-(last(5).x, last(5).y), 0
  122.      LINE (last(2).x, last(2).y)-(last(6).x, last(6).y), 0
  123.      LINE (last(3).x, last(3).y)-(last(7).x, last(7).y), 0
  124.      LINE (last(4).x, last(4).y)-(last(8).x, last(8).y), 0
  125.  
  126. 'draw the new ones
  127.  
  128.      maxz = 0
  129.      FOR a = 1 TO 8
  130.          'CIRCLE (cube(a).x, cube(a).y), (cube(a).z + 5) / 15,INT((cube(a).z + 2) * 4)
  131.          CIRCLE (cube(a).x, cube(a).y), (cube(a).z + 5) / 15, a + 1
  132. '       IF a = 1 THEN PRINT #1, USING "##.###### ##.###### ##.######";cube(a).x, cube(a).y, cube(a).z
  133.          last(a) = cube(a)
  134.  
  135.          IF (cube(a).z) > maxz THEN
  136.              maxz = cube(a).z
  137.              n = a
  138.          END IF
  139.      NEXT a
  140.  
  141.      hist1(n) = hist1(n) + 1
  142.  
  143. ' average z values for each face
  144.  
  145.      f(1).x = (cube(1).x + cube(2).x + cube(3).x + cube(4).x) / 4
  146.      f(2).x = (cube(5).x + cube(6).x + cube(7).x + cube(8).x) / 4
  147.  
  148.      f(3).x = (cube(1).x + cube(2).x + cube(5).x + cube(6).x) / 4
  149.      f(4).x = (cube(1).x + cube(3).x + cube(5).x + cube(7).x) / 4
  150.      f(5).x = (cube(3).x + cube(4).x + cube(7).x + cube(8).x) / 4
  151.      f(6).x = (cube(2).x + cube(4).x + cube(6).x + cube(8).x) / 4
  152.  
  153.      f(1).y = (cube(1).y + cube(2).y + cube(3).y + cube(4).y) / 4
  154.      f(2).y = (cube(5).y + cube(6).y + cube(7).y + cube(8).y) / 4
  155.  
  156.      f(3).y = (cube(1).y + cube(2).y + cube(5).y + cube(6).y) / 4
  157.      f(4).y = (cube(1).y + cube(3).y + cube(5).y + cube(7).y) / 4
  158.      f(5).y = (cube(3).y + cube(4).y + cube(7).y + cube(8).y) / 4
  159.      f(6).y = (cube(2).y + cube(4).y + cube(6).y + cube(8).y) / 4
  160.  
  161.      f(1).z = (cube(1).z + cube(2).z + cube(3).z + cube(4).z) / 4
  162.      f(2).z = (cube(5).z + cube(6).z + cube(7).z + cube(8).z) / 4
  163.  
  164.      f(3).z = (cube(1).z + cube(2).z + cube(5).z + cube(6).z) / 4
  165.      f(4).z = (cube(1).z + cube(3).z + cube(5).z + cube(7).z) / 4
  166.      f(5).z = (cube(3).z + cube(4).z + cube(7).z + cube(8).z) / 4
  167.      f(6).z = (cube(2).z + cube(4).z + cube(6).z + cube(8).z) / 4
  168.  
  169.      maxz = -1
  170.  
  171.      FOR a = 1 TO 6
  172.          CIRCLE (f(a).x, f(a).y), .1, a + 1
  173.          fo(a).x = f(a).x
  174.          fo(a).y = f(a).y
  175.          fo(a).z = f(a).z
  176.  
  177.          IF (f(a).z) > maxz THEN
  178.              maxz = f(a).z
  179.              n = a
  180.          END IF
  181.      NEXT a
  182.  
  183.      hist2(n) = hist2(n) + 1
  184.  
  185.  
  186.      LINE (cube(1).x, cube(1).y)-(cube(2).x, cube(2).y), 15
  187.      LINE (cube(2).x, cube(2).y)-(cube(4).x, cube(4).y), 15
  188.      LINE (cube(3).x, cube(3).y)-(cube(1).x, cube(1).y), 15
  189.      LINE (cube(4).x, cube(4).y)-(cube(3).x, cube(3).y), 15
  190.  
  191.      LINE (cube(5).x, cube(5).y)-(cube(6).x, cube(6).y), 15
  192.      LINE (cube(6).x, cube(6).y)-(cube(8).x, cube(8).y), 15
  193.      LINE (cube(8).x, cube(8).y)-(cube(7).x, cube(7).y), 15
  194.      LINE (cube(7).x, cube(7).y)-(cube(5).x, cube(5).y), 15
  195.  
  196.      LINE (cube(1).x, cube(1).y)-(cube(5).x, cube(5).y), 15
  197.      LINE (cube(2).x, cube(2).y)-(cube(6).x, cube(6).y), 15
  198.      LINE (cube(3).x, cube(3).y)-(cube(7).x, cube(7).y), 15
  199.      LINE (cube(4).x, cube(4).y)-(cube(8).x, cube(8).y), 15
  200.  
  201.      LOCATE 1, 1
  202.      offx1 = 40
  203.      offy1 = 100
  204.  
  205.      offx2 = -30
  206.      offy2 = 100
  207.  
  208.      scale = .04
  209.      diff = 0       ' sum of the distances from original orientation
  210.  
  211.      FOR a = 1 TO 8
  212.          x1 = (a - offx1) * .08
  213.          y1 = (hist1(a) - offy1) * .01
  214.          x2 = (a - offx2) * .08
  215.          y2 = (hist2(a) - offy2) * .01
  216.  
  217.          diff = diff + ((r(a).x - cube(a).x) ^ 2 + (r(a).y - cube(a).y) ^ 2 + (r(a).z - cube(a).z) ^ 2) ^ .5
  218.          LINE (x1, y1)-(x1 + scale, y1 + scale), a + 1, BF
  219.          IF a < 7 THEN LINE (x2, y2)-(x2 + scale, y2 + scale), a + 1, BF
  220.          COLOR a + 1
  221.          PRINT USING "### "; hist1(a);
  222.      NEXT a
  223.      LOCATE 2, 1
  224.      FOR a = 1 TO 6
  225.          COLOR a + 1
  226.          PRINT USING "### "; hist2(a);
  227.      NEXT a
  228.      PRINT
  229.  
  230.      COLOR 15
  231.  
  232.      IF angle > 100 THEN
  233.          IF mindiff > diff THEN
  234.              mindiff = diff
  235.              minang = angle
  236.          END IF
  237.      END IF
  238.      PRINT USING "#### "; angle; xrotate; yrotate; zrotate
  239.      PRINT #1, USING "if (frame > ###) { object { sphere<###.##,###.##,###.##>, 0.25 shiny__yellow }}"; angle; marker.x; marker.y; marker.z
  240.  
  241.      CIRCLE (4 * an + 2, diff / 20 + 2), .01, 12
  242.   NEXT angle
  243.  
  244. CLOSE #1
  245.  
  246. SUB rotate (x, y, z)
  247.       
  248.         x0 = x
  249.         y0 = y
  250.         z0 = z
  251.  
  252.         x1 = x0
  253.         y1 = y0 * COS(xrotate * rad) - z0 * SIN(xrotate * rad)
  254.         z1 = y0 * SIN(xrotate * rad) + z0 * COS(xrotate * rad)
  255.  
  256.         x2 = z1 * SIN(yrotate * rad) + x1 * COS(yrotate * rad)
  257.         y2 = y1
  258.         z2 = z1 * COS(yrotate * rad) - x1 * SIN(yrotate * rad)
  259.  
  260.         x3 = x2 * COS(zrotate * rad) - y2 * SIN(zrotate * rad)
  261.         y3 = x2 * SIN(zrotate * rad) + y2 * COS(zrotate * rad)
  262.         z3 = z2
  263.  
  264.         x = x3
  265.         y = y3
  266.         z = z3
  267.  
  268. END SUB
  269.  
  270.